<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js coal">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>rust common functions - Andrew&#x27;s Blog</title>


        <!-- Custom HTML head -->
        
        <meta name="description" content="Andrew Ryan&#x27;s Blog">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff" />

        <link rel="icon" href="../../favicon.svg">
        <link rel="shortcut icon" href="../../favicon.png">
        <link rel="stylesheet" href="../../css/variables.css">
        <link rel="stylesheet" href="../../css/general.css">
        <link rel="stylesheet" href="../../css/chrome.css">

        <!-- Fonts -->
        <link rel="stylesheet" href="../../FontAwesome/css/font-awesome.css">
        <link rel="stylesheet" href="../../fonts/fonts.css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="../../highlight.css">
        <link rel="stylesheet" href="../../tomorrow-night.css">
        <link rel="stylesheet" href="../../ayu-highlight.css">

        <!-- Custom theme stylesheets -->
        <link rel="stylesheet" href="../../src/style/custom.css">

        <!-- MathJax -->
        <script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
    </head>
    <body>
    <div id="body-container">
        <!-- Provide site root to javascript -->
        <script>
            var path_to_root = "../../";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "coal" : "coal";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script>
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script>
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('no-js')
            html.classList.remove('coal')
            html.classList.add(theme);
            html.classList.add('js');
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script>
            var html = document.querySelector('html');
            var sidebar = null;
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            } else {
                sidebar = 'hidden';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item affix "><a href="../../index.html">Andrew's Blog</a></li><li class="chapter-item "><a href="../../posts/linux/linux.html"><strong aria-hidden="true">1.</strong> Linux</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/linux/install_linux.html"><strong aria-hidden="true">1.1.</strong> install linux</a></li><li class="chapter-item "><a href="../../posts/linux/bash_profile.html"><strong aria-hidden="true">1.2.</strong> bash profile</a></li><li class="chapter-item "><a href="../../posts/linux/command_list.html"><strong aria-hidden="true">1.3.</strong> command list</a></li><li class="chapter-item "><a href="../../posts/linux/git_guide.html"><strong aria-hidden="true">1.4.</strong> git guide</a></li><li class="chapter-item "><a href="../../posts/linux/tar.html"><strong aria-hidden="true">1.5.</strong> tar</a></li><li class="chapter-item "><a href="../../posts/Linux/git_cheatsheet.html"><strong aria-hidden="true">1.6.</strong> Git Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/Linux/bash_cheatsheet.html"><strong aria-hidden="true">1.7.</strong> Bash Cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/macos/mac.html"><strong aria-hidden="true">2.</strong> MacOS</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/macos/macos_profiles.html"><strong aria-hidden="true">2.1.</strong> macos profiles</a></li><li class="chapter-item "><a href="../../posts/macos/macos_pwn_env_setup.html"><strong aria-hidden="true">2.2.</strong> macos pwn env setup</a></li></ol></li><li class="chapter-item "><a href="../../posts/swift/swift.html"><strong aria-hidden="true">3.</strong> Swift</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/swift/learn_swift.html"><strong aria-hidden="true">3.1.</strong> learn swift basics</a></li><li class="chapter-item "><a href="../../posts/swift/swift_extensions.html"><strong aria-hidden="true">3.2.</strong> Swift extensions</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_extension.html"><strong aria-hidden="true">3.3.</strong> SwiftUI extensions</a></li><li class="chapter-item "><a href="../../posts/swift/install_swift.html"><strong aria-hidden="true">3.4.</strong> install swift</a></li><li class="chapter-item "><a href="../../posts/swift/task_planner.html"><strong aria-hidden="true">3.5.</strong> implment task panner app with SwiftUI</a></li><li class="chapter-item "><a href="../../posts/swift/swift_cheat_sheet.html"><strong aria-hidden="true">3.6.</strong> Swift Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/swift/yinci_url.html"><strong aria-hidden="true">3.7.</strong> Personal privacy protocol</a></li><li class="chapter-item "><a href="../../posts/swift/swift_regular_exressions.html"><strong aria-hidden="true">3.8.</strong> Swift regular exressions</a></li><li class="chapter-item "><a href="../../posts/ios/how_to_create_beautiful_ios_charts_in_swift.html"><strong aria-hidden="true">3.9.</strong> How to Create Beautiful iOS Charts in Swift</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_source_code.html"><strong aria-hidden="true">3.10.</strong> SwiftUI source code</a></li><li class="chapter-item "><a href="../../posts/swift/use_swift_fetch_iciba_api.html"><strong aria-hidden="true">3.11.</strong> use swift fetch iciba API</a></li></ol></li><li class="chapter-item "><a href="../../posts/ios/ios.html"><strong aria-hidden="true">4.</strong> iOS</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ios/cocaposd_setup_and_install_for_ios_project.html"><strong aria-hidden="true">4.1.</strong> cocaposd setup and install for ios project</a></li><li class="chapter-item "><a href="../../posts/ios/swiftui_show_gif_image.html"><strong aria-hidden="true">4.2.</strong> SwiftUI show gif image</a></li><li class="chapter-item "><a href="../../posts/ios/implement_task_planner_app.html"><strong aria-hidden="true">4.3.</strong> implement Task planner App</a></li></ol></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c.html"><strong aria-hidden="true">5.</strong> Objective-C</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/objective_c/objective_c_cheat_sheet.html"><strong aria-hidden="true">5.1.</strong> Objective-C Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c_for_absolute_beginners_read_note.html"><strong aria-hidden="true">5.2.</strong> Objective-C Note</a></li></ol></li><li class="chapter-item "><a href="../../posts/dart/dart.html"><strong aria-hidden="true">6.</strong> Dart</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/dart/flutter.html"><strong aria-hidden="true">6.1.</strong> Flutter Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/dart/dart_cheat_sheet.html"><strong aria-hidden="true">6.2.</strong> Dart Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/flutter/flutter_dev_test.html"><strong aria-hidden="true">6.3.</strong> Flutter dev test</a></li></ol></li><li class="chapter-item "><a href="../../posts/rust/rust.html"><strong aria-hidden="true">7.</strong> Rust</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/rust/offline_use_rust.html"><strong aria-hidden="true">7.1.</strong> Offline use rust</a></li><li class="chapter-item "><a href="../../posts/rust/rust_grammer.html"><strong aria-hidden="true">7.2.</strong> rust grammar</a></li><li class="chapter-item "><a href="../../posts/rust/pase_string_and_decimal_conversion.html"><strong aria-hidden="true">7.3.</strong> pase string and decimal conversion</a></li><li class="chapter-item "><a href="../../posts/rust/parse_types.html"><strong aria-hidden="true">7.4.</strong> rust types</a></li><li class="chapter-item "><a href="../../posts/rust/rust_life_cycle.html"><strong aria-hidden="true">7.5.</strong> Rust life cycle</a></li><li class="chapter-item "><a href="../../posts/rust/rust_generic.html"><strong aria-hidden="true">7.6.</strong> rust generics</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implment_matrix.html"><strong aria-hidden="true">7.7.</strong> Rust implement matrix</a></li><li class="chapter-item "><a href="../../posts/rust/rust_sort.html"><strong aria-hidden="true">7.8.</strong> Rust implement sort algorithms</a></li><li class="chapter-item "><a href="../../posts/rust/implement_aes_encryption.html"><strong aria-hidden="true">7.9.</strong> Rust implement AEC encryption and decryption</a></li><li class="chapter-item "><a href="../../posts/rust/implement_trie_data_structure.html"><strong aria-hidden="true">7.10.</strong> implement trie data structure</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_tree.html"><strong aria-hidden="true">7.11.</strong> implement tree data_structure</a></li><li class="chapter-item "><a href="../../posts/rust/list_dir.html"><strong aria-hidden="true">7.12.</strong> list dir</a></li><li class="chapter-item "><a href="../../posts/rust/fast_way_to_implment_object_trait.html"><strong aria-hidden="true">7.13.</strong> fast way to implment object trait</a></li><li class="chapter-item "><a href="../../posts/rust/compress_rust_binary_size.html"><strong aria-hidden="true">7.14.</strong> compress rust binary size</a></li><li class="chapter-item "><a href="../../posts/rust/implment_file_upload_backend.html"><strong aria-hidden="true">7.15.</strong> impliment file upload</a></li><li class="chapter-item "><a href="../../posts/rust/this_is_add_post_cli_implementation_in_rust.html"><strong aria-hidden="true">7.16.</strong> this is add_post cli implementation in rust</a></li><li class="chapter-item "><a href="../../posts/rust/use_rust_implment_a_copyclipbord_cli.html"><strong aria-hidden="true">7.17.</strong> Use rust implment a copyclipbord CLI</a></li><li class="chapter-item "><a href="../../posts/rust/sqlite_database_add_delete_update_show_in_rust.html"><strong aria-hidden="true">7.18.</strong> sqlite database add delete update show in rust</a></li><li class="chapter-item "><a href="../../posts/rust/implementing_tokio_joinhandle_for_wasm.html"><strong aria-hidden="true">7.19.</strong> Implementing tokio JoinHandle for wasm</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_a_crate_for_encode_and_decode_brainfuck_and_ook.html"><strong aria-hidden="true">7.20.</strong> rust implement a crate for encode and decode brainfuck and ook</a></li><li class="chapter-item "><a href="../../posts/rust/slint_builtin_elements.html"><strong aria-hidden="true">7.21.</strong> Slint Builtin Elements</a></li><li class="chapter-item "><a href="../../posts/rust/corporate_network_install_rust_on_windows.html"><strong aria-hidden="true">7.22.</strong> Corporate network install Rust on windows</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_file_how_to_judge_static_link_or_dynamic_link_in_macos.html"><strong aria-hidden="true">7.23.</strong> rust binary file how to judge static link or dynamic link in Macos</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_include_dir_and_get_contents.html"><strong aria-hidden="true">7.24.</strong> rust binary include dir and get contents</a></li><li class="chapter-item "><a href="../../posts/rust/how_to_create_yolov8_based_object_detection_web_service_using_python,_julia,_node.js,_javascript,_go_and_rust.html"><strong aria-hidden="true">7.25.</strong> How to create YOLOv8-based object detection web service using Python, Julia, Node.js, JavaScript, Go and Rust</a></li><li class="chapter-item "><a href="../../posts/rust/implment_builder_proc_macro_for_command_struct.html"><strong aria-hidden="true">7.26.</strong> implment Builder proc-macro for Command struct</a></li></ol></li><li class="chapter-item "><a href="../../posts/java/java.html"><strong aria-hidden="true">8.</strong> Java</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/java/java_grammar.html"><strong aria-hidden="true">8.1.</strong> java grammar and codewar</a></li><li class="chapter-item "><a href="../../posts/java/run_jar.html"><strong aria-hidden="true">8.2.</strong> java run .jar</a></li><li class="chapter-item "><a href="../../posts/java/java_pomxml_add_defaultgoal_to_build.html"><strong aria-hidden="true">8.3.</strong> Java pomxml add defaultGoal to build</a></li><li class="chapter-item "><a href="../../posts/java/java_set_mvn_mirror.html"><strong aria-hidden="true">8.4.</strong> Java set mvn mirror</a></li></ol></li><li class="chapter-item "><a href="../../posts/python/python.html"><strong aria-hidden="true">9.</strong> Python</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/python/convert_pesn.html"><strong aria-hidden="true">9.1.</strong> convert pesn</a></li><li class="chapter-item "><a href="../../posts/python/find_remove_dir.html"><strong aria-hidden="true">9.2.</strong> find and remove dir</a></li><li class="chapter-item "><a href="../../posts/python/timing_message.html"><strong aria-hidden="true">9.3.</strong> wechat send message</a></li><li class="chapter-item "><a href="../../posts/python/use_python_openpyxl_package_read_and_edit_excel_files.html"><strong aria-hidden="true">9.4.</strong> Use python openpyxl package read and edit excel files</a></li><li class="chapter-item "><a href="../../posts/python/sanctum_model_yaml.html"><strong aria-hidden="true">9.5.</strong> sanctum model yaml</a></li><li class="chapter-item "><a href="../../posts/python/how_to_detect_objects_on_images_using_the_yolov8_neural_network.html"><strong aria-hidden="true">9.6.</strong> How to detect objects on images using the YOLOv8 neural network</a></li><li class="chapter-item "><a href="../../posts/python/use_huggingface_model.html"><strong aria-hidden="true">9.7.</strong> use huggingface model</a></li></ol></li><li class="chapter-item "><a href="../../posts/go/go.html"><strong aria-hidden="true">10.</strong> Go</a></li><li class="chapter-item "><a href="../../posts/javascript/js.html"><strong aria-hidden="true">11.</strong> Javascript</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/javascript/js_tutorial.html"><strong aria-hidden="true">11.1.</strong> js tutorial</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_map.html"><strong aria-hidden="true">11.2.</strong> ja map</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_math.html"><strong aria-hidden="true">11.3.</strong> js math</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_object.html"><strong aria-hidden="true">11.4.</strong> js object</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_set.html"><strong aria-hidden="true">11.5.</strong> js set</a></li><li class="chapter-item "><a href="../../posts/javascript/single_thread_and_asynchronous.html"><strong aria-hidden="true">11.6.</strong> single thread and asynchronous</a></li><li class="chapter-item "><a href="../../posts/javascript/this.html"><strong aria-hidden="true">11.7.</strong> js this</a></li><li class="chapter-item "><a href="../../posts/javascript/js_implment_aes.html"><strong aria-hidden="true">11.8.</strong> js implment aes</a></li><li class="chapter-item "><a href="../../posts/javascript/getting_started_with_ajax.html"><strong aria-hidden="true">11.9.</strong> getting started with ajax</a></li><li class="chapter-item "><a href="../../posts/javascript/BinarySearchTree.html"><strong aria-hidden="true">11.10.</strong> binary search tree</a></li><li class="chapter-item "><a href="../../posts/javascript/goole_zx.html"><strong aria-hidden="true">11.11.</strong> goole zx</a></li><li class="chapter-item "><a href="../../posts/javascript/es6.html"><strong aria-hidden="true">11.12.</strong> es6</a></li></ol></li><li class="chapter-item "><a href="../../posts/ruby/ruby.html"><strong aria-hidden="true">12.</strong> Ruby</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ruby/rails_setup_env.html"><strong aria-hidden="true">12.1.</strong> ruby on rails setup environment</a></li><li class="chapter-item "><a href="../../posts/ruby/learn_ruby.html"><strong aria-hidden="true">12.2.</strong> learn ruby</a></li><li class="chapter-item "><a href="../../posts/ruby/ruby_note.html"><strong aria-hidden="true">12.3.</strong> Ruby Note</a></li><li class="chapter-item "><a href="../../posts/ruby/setup_ruby_for_ctf.html"><strong aria-hidden="true">12.4.</strong> Setup ruby for CTF</a></li></ol></li><li class="chapter-item "><a href="../../posts/react/react.html"><strong aria-hidden="true">13.</strong> React</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/react/react_life_cycle.html"><strong aria-hidden="true">13.1.</strong> react life cycle</a></li><li class="chapter-item "><a href="../../posts/react/react_router.html"><strong aria-hidden="true">13.2.</strong> react router</a></li><li class="chapter-item "><a href="../../posts/react/react_this.html"><strong aria-hidden="true">13.3.</strong> react this</a></li><li class="chapter-item "><a href="../../posts/react/react_interviw.html"><strong aria-hidden="true">13.4.</strong> react interview</a></li><li class="chapter-item "><a href="../../posts/react/important_react_interview.html"><strong aria-hidden="true">13.5.</strong> important react interview</a></li><li class="chapter-item "><a href="../../posts/react/react_quick_reference.html"><strong aria-hidden="true">13.6.</strong> react quick reference</a></li><li class="chapter-item "><a href="../../posts/react/redux_quick_reference.html"><strong aria-hidden="true">13.7.</strong> redux quick reference</a></li></ol></li><li class="chapter-item "><a href="../../posts/vue/vue.html"><strong aria-hidden="true">14.</strong> Vue</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/vue/vue_ajax.html"><strong aria-hidden="true">14.1.</strong> vue ajax</a></li></ol></li><li class="chapter-item "><a href="../../posts/angular/angular.html"><strong aria-hidden="true">15.</strong> Angular</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/angular/controller_communication.html"><strong aria-hidden="true">15.1.</strong> controller communication</a></li><li class="chapter-item "><a href="../../posts/angular/creating_custom_directives.html"><strong aria-hidden="true">15.2.</strong> creating custom directives</a></li><li class="chapter-item "><a href="../../posts/angular/directive_notes.html"><strong aria-hidden="true">15.3.</strong> directive notes</a></li><li class="chapter-item "><a href="../../posts/angular/directive_communication.html"><strong aria-hidden="true">15.4.</strong> directive communication</a></li><li class="chapter-item "><a href="../../posts/angular/post_params.html"><strong aria-hidden="true">15.5.</strong> post params</a></li><li class="chapter-item "><a href="../../posts/angular/read_json_angular.html"><strong aria-hidden="true">15.6.</strong> read json angular</a></li><li class="chapter-item "><a href="../../posts/angular/same_route_reload.html"><strong aria-hidden="true">15.7.</strong> same route reload</a></li></ol></li><li class="chapter-item "><a href="../../posts/css/css.html"><strong aria-hidden="true">16.</strong> Css</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/css/use_css_media.html"><strong aria-hidden="true">16.1.</strong> use css media</a></li></ol></li><li class="chapter-item "><a href="../../posts/php/php.html"><strong aria-hidden="true">17.</strong> Php</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/php/for_php_string_implment_some_extemtion_functions.html"><strong aria-hidden="true">17.1.</strong> for php string implment some extemtion functions</a></li><li class="chapter-item "><a href="../../posts/php/php_cheatsheet.html"><strong aria-hidden="true">17.2.</strong> PHP cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/windows/windows.html"><strong aria-hidden="true">18.</strong> Windows</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/windows/windows.html"><strong aria-hidden="true">18.1.</strong> Windows</a></li><li class="chapter-item "><a href="../../posts/windows/windows10_use_powershell_dedup_redundent_path.html"><strong aria-hidden="true">18.2.</strong> Windows10 use PowerShell dedup redundent PATH</a></li></ol></li><li class="chapter-item expanded "><a href="../../posts/leetcode/leetcode.html"><strong aria-hidden="true">19.</strong> Leetcode</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/leetcode/rust_leetcode.html"><strong aria-hidden="true">19.1.</strong> rust leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_codewar.html"><strong aria-hidden="true">19.2.</strong> rust codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/swift_codewar.html"><strong aria-hidden="true">19.3.</strong> swift codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/js_leetcode.html"><strong aria-hidden="true">19.4.</strong> js leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/java_leetcode.html"><strong aria-hidden="true">19.5.</strong> java leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_huawei.html"><strong aria-hidden="true">19.6.</strong> huawei test</a></li><li class="chapter-item expanded "><a href="../../posts/leetcode/rust_utils.html" class="active"><strong aria-hidden="true">19.7.</strong> rust common functions</a></li><li class="chapter-item "><a href="../../posts/leetcode/olympiad_training.html"><strong aria-hidden="true">19.8.</strong> Computer olympiad training</a></li></ol></li><li class="chapter-item "><a href="../../posts/ctf/CTF.html"><strong aria-hidden="true">20.</strong> CTF</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ctf/CTF_Note.html"><strong aria-hidden="true">20.1.</strong> CTF Note</a></li><li class="chapter-item "><a href="../../posts/ctf/0.1_Web.html"><strong aria-hidden="true">20.2.</strong> Web</a></li><li class="chapter-item "><a href="../../posts/ctf/4.1_Misc.html"><strong aria-hidden="true">20.3.</strong> Misc</a></li><li class="chapter-item "><a href="../../posts/ctf/3.2_PWN_note.html"><strong aria-hidden="true">20.4.</strong> PWN</a></li><li class="chapter-item "><a href="../../posts/ctf/3.1_Crypto.html"><strong aria-hidden="true">20.5.</strong> Crypto</a></li><li class="chapter-item "><a href="../../posts/ctf/3.4_RSA_note.html"><strong aria-hidden="true">20.6.</strong> Rsa attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.5_Base64.html"><strong aria-hidden="true">20.7.</strong> Base64</a></li><li class="chapter-item "><a href="../../posts/ctf/0.0_SQL Injection Cheatsheet.html"><strong aria-hidden="true">20.8.</strong> SQL Injection Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/1.1_SQL_injection.html"><strong aria-hidden="true">20.9.</strong> SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.2_SQL_injection_UNION_attacks.html"><strong aria-hidden="true">20.10.</strong> SQL Injection UNION attacks</a></li><li class="chapter-item "><a href="../../posts/ctf/1.3_Blind SQL injection.html"><strong aria-hidden="true">20.11.</strong> Blind SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.4_Code Injection.html"><strong aria-hidden="true">20.12.</strong> Code Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.5_SSRF.html"><strong aria-hidden="true">20.13.</strong> SSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.6_OS command injection.html"><strong aria-hidden="true">20.14.</strong> OS command injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.7_Local file inclusion.html"><strong aria-hidden="true">20.15.</strong> Local file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.8_Remote file inclusion.html"><strong aria-hidden="true">20.16.</strong> Remote file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.9_CSRFm.html"><strong aria-hidden="true">20.17.</strong> CSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.10_NoSQL injection.html"><strong aria-hidden="true">20.18.</strong> NoSQL injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.11_JSON injection.html"><strong aria-hidden="true">20.19.</strong> JSON injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.12_CTF_Web_SQL_Note.html"><strong aria-hidden="true">20.20.</strong> CTF Web SQL Note</a></li><li class="chapter-item "><a href="../../posts/ctf/2.1_XXE.html"><strong aria-hidden="true">20.21.</strong> XXE</a></li><li class="chapter-item "><a href="../../posts/ctf/2.2_XSS.html"><strong aria-hidden="true">20.22.</strong> XSS</a></li><li class="chapter-item "><a href="../../posts/ctf/2.3_Upload File.html"><strong aria-hidden="true">20.23.</strong> Upload File</a></li><li class="chapter-item "><a href="../../posts/ctf/2.4_serialize_unserialize.html"><strong aria-hidden="true">20.24.</strong> serialize unserialize</a></li><li class="chapter-item "><a href="../../posts/ctf/2.5_Race condition.html"><strong aria-hidden="true">20.25.</strong> Race condition</a></li><li class="chapter-item "><a href="../../posts/ctf/zip_plain_text_attack.html"><strong aria-hidden="true">20.26.</strong> Zip plain text attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.3_pwn HCTF2016 brop.html"><strong aria-hidden="true">20.27.</strong> pwn HCTF2016 brop</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_patch_defense_skill.html"><strong aria-hidden="true">20.28.</strong> PWN Patch defense skill</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_stack_overflow.html"><strong aria-hidden="true">20.29.</strong> PWN stack overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_heap_overflow.html"><strong aria-hidden="true">20.30.</strong> PWN heap overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_format_string_vulnerability.html"><strong aria-hidden="true">20.31.</strong> PWN Format String Vulnerability</a></li><li class="chapter-item "><a href="../../posts/ctf/kali_linux_tutorials.html"><strong aria-hidden="true">20.32.</strong> Kali linux tutorials</a></li><li class="chapter-item "><a href="../../posts/ctf/google_dorks_2023_lists.html"><strong aria-hidden="true">20.33.</strong> Google Dorks 2023 Lists</a></li><li class="chapter-item "><a href="../../posts/ctf/dvwa_writeup.html"><strong aria-hidden="true">20.34.</strong> DVWA WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/bwapp_writeup.html"><strong aria-hidden="true">20.35.</strong> bWAPP WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/sqlilabs_writeup.html"><strong aria-hidden="true">20.36.</strong> sqlilabs WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/pwnable_kr_challenge.html"><strong aria-hidden="true">20.37.</strong> Solutions for pwnable.kr</a></li><li class="chapter-item "><a href="../../posts/ctf/the_periodic_table.html"><strong aria-hidden="true">20.38.</strong> The Periodic Table</a></li><li class="chapter-item "><a href="../../posts/ctf/pwntools_cheatsheet.html"><strong aria-hidden="true">20.39.</strong> Pwntools Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/gdb_cheatsheet.html"><strong aria-hidden="true">20.40.</strong> GDB Cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/iltes/iltes.html"><strong aria-hidden="true">21.</strong> ILTES</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/iltes/iltes_writing.html"><strong aria-hidden="true">21.1.</strong> ILTES Writing</a></li></ol></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <!-- Track and set sidebar scroll position -->
        <script>
            var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
            sidebarScrollbox.addEventListener('click', function(e) {
                if (e.target.tagName === 'A') {
                    sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
                }
            }, { passive: true });
            var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
            sessionStorage.removeItem('sidebar-scroll');
            if (sidebarScrollTop) {
                // preserve sidebar scroll position when navigating via links within sidebar
                sidebarScrollbox.scrollTop = sidebarScrollTop;
            } else {
                // scroll sidebar to current active section when navigating via "next/previous chapter" buttons
                var activeSection = document.querySelector('#sidebar .active');
                if (activeSection) {
                    activeSection.scrollIntoView({ block: 'center' });
                }
            }
        </script>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky">
                    <div class="left-buttons">
                        <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </button>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                    </div>

                    <h1 class="menu-title">Andrew&#x27;s Blog</h1>

                    <div class="right-buttons">
                        <a href="https://gitee.com/dnrops/dnrops" title="Git repository" aria-label="Git repository">
                            <i id="git-repository-button" class="fa fa-github"></i>
                        </a>

                    </div>
                </div>

                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script>
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1 id="common-functions-implementation"><a class="header" href="#common-functions-implementation">Common functions implementation</a></h1>
<h2 id="substring"><a class="header" href="#substring">substring</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn sub_string(s: String, start: usize, end: usize) -&gt; String {
    s.get(start..=end).unwrap().to_string()
}
<span class="boring">}</span></code></pre></pre>
<h2 id="convert-hexadecimal-to-decimal"><a class="header" href="#convert-hexadecimal-to-decimal">convert hexadecimal to decimal</a></h2>
<pre><pre class="playground"><code class="language-rust">/*
十六进制转换为十进制
*/
fn hexadecimal_to_decimal(h: &amp;str) -&gt; i32 {
    let mut result = 0;
    for c in h.get(2..).unwrap().to_string().chars() {
        match c.to_digit(16) {
            Some(d) =&gt; result = result * 16 + d as i32,
            None =&gt; return -1,
        }
    }
    result
}
fn main(){
    let re = hexadecimal_to_decimal(&quot;0xA0&quot;);
    println!(&quot;{}&quot;, re);//160
}</code></pre></pre>
<h2 id="parse-string-to-i32"><a class="header" href="#parse-string-to-i32">parse string to i32</a></h2>
<pre><pre class="playground"><code class="language-rust">fn parse_to_int(b: &amp;str) -&gt; Option&lt;i32&gt; {
    if b.len() == 0 {
        return None;
    }
    let mut res = 0;
    for c in b.chars() {
        res *= 10;
        res += c as i32 - 48;
    }
    return Some(res);
}
fn main(){
    let re = parse_to_int(&quot;1014565115&quot;);
    println!(&quot;{:?}&quot;, re);
}</code></pre></pre>
<h2 id="binary-to-decimal"><a class="header" href="#binary-to-decimal">binary to decimal</a></h2>
<pre><pre class="playground"><code class="language-rust">/* 
二进制转换为十进制
*/
fn binary_to_decimal(num: &amp;str) -&gt; Option&lt;i64&gt; {
    if num.len() == 0 {
        return None;
    }
    let mut sum = 0;
    let vec = num
        .chars()
        .map(|x| i64::from(x.to_digit(10).unwrap()))
        .collect::&lt;Vec&lt;i64&gt;&gt;();
    for (index, item) in vec.iter().rev().enumerate() {
        sum += i64::pow(2, index as u32) * item;
    }
    Some(sum)
}
fn main(){
     let re = binary_to_decimal(&quot;101&quot;);
    println!(&quot;{:?}&quot;, re);
}</code></pre></pre>
<h2 id="all-prime-factors"><a class="header" href="#all-prime-factors">all prime factors</a></h2>
<pre><pre class="playground"><code class="language-rust">/*
数的所有质数因子
*/
fn all_prime_factors(n: usize) -&gt; Vec&lt;usize&gt; {
    let mut n = n as usize;
    let mut factors: Vec&lt;usize&gt; = vec![];
    for i in 2..n * n {
        while n % i == 0 {
            factors.push(i);
            n /= i;
        }
    }
    factors
}
fn main(){
     let re = all_prime_factors(40);
    println!(&quot;{:?}&quot;, re); //[2,2,2,5]
}</code></pre></pre>
<h2 id="round"><a class="header" href="#round">round</a></h2>
<pre><pre class="playground"><code class="language-rust">/*
 四舍五入
*/
fn round(f: f64) -&gt; i64 {
    (f + 0.5).floor() as i64
}
fn main() {
    let re = round(10.4);
    assert_eq!(10, re);
}</code></pre></pre>
<h2 id="input-from-terminal"><a class="header" href="#input-from-terminal">input from terminal</a></h2>
<pre><pre class="playground"><code class="language-rust">pub fn input_string() -&gt; String {
    let mut input = String::new();
    std::io::stdin().read_line(&amp;mut input).unwrap();
    input.trim().to_string()
}
pub fn input_num&lt;T&gt;() -&gt; T
where
    &lt;T as std::str::FromStr&gt;::Err: std::fmt::Debug,
    T: std::str::FromStr,
{
    let mut input = String::new();
    std::io::stdin().read_line(&amp;mut input).unwrap();
    input.trim().to_string().parse::&lt;T&gt;().unwrap()
}

pub fn input_vec_string(split_by: &amp;str) -&gt; Vec&lt;String&gt; {
    let mut input = String::new();
    std::io::stdin().read_line(&amp;mut input).unwrap();
    input
        .trim()
        .split(split_by)
        .filter(|s| !s.is_empty())
        .map(|s| s.trim().to_string())
        .map(|s| s.to_string())
        .collect::&lt;Vec&lt;String&gt;&gt;()
}
pub fn input_vec_num&lt;T&gt;(split_by: &amp;str) -&gt; Vec&lt;T&gt;
where
    &lt;T as std::str::FromStr&gt;::Err: std::fmt::Debug,
    T: std::str::FromStr,
{
    let mut input = String::new();
    std::io::stdin().read_line(&amp;mut input).unwrap();
    input
        .trim()
        .split(split_by)
        .filter(|s| !s.is_empty())
        .map(|s| s.trim().to_string())
        .map(|s| s.parse::&lt;T&gt;().unwrap())
        .collect::&lt;Vec&lt;T&gt;&gt;()
}
fn input_loop() -&gt; std::io::Lines&lt;std::io::StdinLock&lt;'static&gt;&gt; {
    use std::io::{self, *};
    let stdin = io::stdin();
    stdin.lock().lines()
}
fn main() {
    for line in input_loop() {
        println!(&quot;{}&quot;, line.unwrap());
    }
}

</code></pre></pre>
<h2 id="padding和对齐"><a class="header" href="#padding和对齐">padding和对齐</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>// 右对齐，不足左边补空格
println!(&quot;|{:6}|&quot;, 21);//|    21|
println!(&quot;|{:&gt;6}|&quot;, 21);//|    21|
// 右对齐，不足左边补0
println!(&quot;{:06}&quot;, 21);//000021
println!(&quot;{:&gt;06}&quot;, 21);//000021
println!(&quot;{:0&gt;6}&quot;, 21);//000021
// 右对齐，左边补-
println!(&quot;{:-&gt;6}&quot;, 21);//----21

// 居中对齐
println!(&quot;|{:^6}|&quot;, 21);//|  21  |
// 左对齐，右边补-
println!(&quot;|{:-&lt;6}|&quot;, 21);//|21----|
<span class="boring">}</span></code></pre></pre>
<h2 id="数组去重"><a class="header" href="#数组去重">数组去重</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span> pub fn huawei_2016_17() {
        let s = vec![1, 0, 1, 0, 0, 0, 1];
        fn remove_repeat(v: Vec&lt;i32&gt;) -&gt; Vec&lt;i32&gt; {
            let mut res = vec![];
            for i in 0..v.len() {
                if res.contains(&amp;v[i]) {
                    continue;
                } else {
                    res.push(v[i]);
                }
            }
            res
        }
        let res = remove_repeat(s);
        println!(&quot;{:?}&quot;, res);//[1,0]
}
<span class="boring">}</span></code></pre></pre>
<h2 id="vertor-中的邻居"><a class="header" href="#vertor-中的邻居">vertor 中的邻居</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn huawei_2016_18() {
        let v = Vec::from(&quot;zankxnsk1515-5151xsx45&quot;);
        let digits = v
            .iter()
            .enumerate()
            .filter(|(i, c)| (**c as char).is_digit(10))
            .map(|(i, c)| (i, *c, *c as char))
            .collect::&lt;Vec&lt;_&gt;&gt;();
        println!(&quot;{:?}&quot;, digits);
        let mut d_iter = digits.iter();
        let mut v = vec![];
        while let Some(d) = d_iter.next() {
            if let Some(d1) = d_iter.next() {
                v.push([d.2, d1.2]);
            }
        }
        // [['1', '5'], ['1', '5'], ['5', '1'], ['5', '1'], ['4', '5']]
        println!(&quot;{:?}&quot;, v);
}
<span class="boring">}</span></code></pre></pre>
<h2 id="排序的vec去重-并return重复的元素数量"><a class="header" href="#排序的vec去重-并return重复的元素数量">排序的Vec去重 并return重复的元素数量</a></h2>
<pre><pre class="playground"><code class="language-rust">fn remove_duplicates_from_sorted_vec(nums: Vec&lt;i32&gt;) -&gt; usize {
    if nums.len() &lt; 1 {
        return 0;
    };
    let n = nums.len();
    let mut nums = nums.clone();
    let mut j = 0;
    for i in 0..n {
        if nums[j] != nums[i] {
            j += 1;
            nums[j] = nums[i];
        }
    }
    let (unique, duplicate) = nums.split_at(j + 1);
    println!(&quot;{:?}&quot;, unique); // unique vec
    println!(&quot;{:?}&quot;, duplicate); // duplicate vec
                                 // [0, 1, 2, 3, 4]
                                 // [2, 2, 3, 3, 4]
                                 // 5
    return j + 1; //重复的元素数
}
fn main() {
    let res = remove_duplicates_from_sorted_vec(vec![0, 0, 1, 1, 1, 2, 2, 3, 3, 4]);
    println!(&quot;{}&quot;, res);
}</code></pre></pre>
<h2 id="判断链表是否有环"><a class="header" href="#判断链表是否有环">判断链表是否有环</a></h2>
<pre><code class="language-java">public boolean hasCycle(ListNode head) {
    if (head == null || head.next == null) {
        return false;
    }
    ListNode slow = head;
    ListNode fast = head.next;
    while (slow != fast) {
        if (fast == null || fast.next == null) {
            return false;
        }
        slow = slow.next;
        fast = fast.next.next;
    }
    return true;
}
</code></pre>
<h1 id="字符串中找出数字--find-all-digit-in-string"><a class="header" href="#字符串中找出数字--find-all-digit-in-string">字符串中找出数字  find all digit in string</a></h1>
<pre><pre class="playground"><code class="language-rust"> pub fn findall_digit(s: &amp;str) -&gt; Vec&lt;i64&gt; {
            let mut s = s.chars().collect::&lt;Vec&lt;_&gt;&gt;();
            let ss = s.clone();
            for (i, c) in ss.iter().enumerate() {
                if !c.is_digit(10) &amp;&amp; i &lt; ss.len() {
                    s[i] = ' ';
                }
            }
            let s_digit = s.iter().map(|s| s.to_string()).collect::&lt;Vec&lt;_&gt;&gt;().join(&quot;&quot;);

            s_digit
                .split(&quot; &quot;)
                .filter(|s| !s.is_empty())
                .map(|s| s.trim().to_string())
                .map(|s| s.parse::&lt;i64&gt;().unwrap())
                .collect::&lt;Vec&lt;i64&gt;&gt;()
}
fn main(){
    let res = findall_digit(&quot;xsxsx54xsxs45x4sx&quot;);   
    println!(&quot;{:?}&quot;, res); //[54, 45, 4]
}</code></pre></pre>
<h2 id="string-全排列-full-arrangement"><a class="header" href="#string-全排列-full-arrangement">String 全排列 (full arrangement)</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>fn full_arrangement(s: String) -&gt; Vec&lt;String&gt; {
    let s_string = s.to_string();
    let mut out_vec = Vec::new();
    for i in 0..s.len() + 1 {
        for j in i + 1..s.len() + 1 {
            out_vec.push(s_string.get(i..j).unwrap().to_string());
        }
    }
    out_vec
}
println!(&quot;{:?}&quot;, full_arrangement(&quot;123&quot;.to_string())); //[&quot;1&quot;, &quot;12&quot;, &quot;123&quot;, &quot;2&quot;, &quot;23&quot;, &quot;3&quot;]
<span class="boring">}</span></code></pre></pre>
<h2 id="vec-全排列-full-arrangement"><a class="header" href="#vec-全排列-full-arrangement">Vec 全排列 (full arrangement)</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>fn full_arrangement(s: Vec&lt;i32&gt;) -&gt; Vec&lt;Vec&lt;i32&gt;&gt; {
        let mut out_vec = Vec::new();
        for i in 0..s.len() + 1 {
            for j in i + 1..s.len() + 1 {
                out_vec.push(s.get(i..j).unwrap().to_owned());
            }
        }
        out_vec
    }
println!(&quot;{:?}&quot;, full_arrangement(vec![1, 2, 3])); //[[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
<span class="boring">}</span></code></pre></pre>
<h2 id="vec-排序"><a class="header" href="#vec-排序">Vec 排序</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn permute(nums: Vec&lt;i32&gt;) -&gt; Vec&lt;Vec&lt;i32&gt;&gt; {
        if nums.len() &lt;= 1 { return vec![nums]; };
        let mut ret = vec![];
        for i in 0..nums.len() {
            let mut iter_ret = vec![];
            let mut cloned_nums = nums.clone();
            let index_item = cloned_nums.remove(i);
            iter_ret.push(index_item);
            for x in Solution::permute(cloned_nums) {
                let mut cloned_iter_ret = iter_ret.clone();
                cloned_iter_ret.extend(x);
                ret.push(cloned_iter_ret);
            }
        }
        ret
}
 let ret = vec![
            vec![1, 2, 3],
            vec![1, 3, 2],
            vec![2, 1, 3],
            vec![2, 3, 1],
            vec![3, 1, 2],
            vec![3, 2, 1]
];
assert_eq!(ret, permute(vec![1, 2, 3]));//全排序
<span class="boring">}</span></code></pre></pre>
<h2 id="vec-组合-combinations"><a class="header" href="#vec-组合-combinations">Vec 组合 (combinations)</a></h2>
<pre><pre class="playground"><code class="language-rust">pub fn combinations() {
        // 组合 Combination
        pub struct Combinations&lt;T&gt;
        where
            T: Ord + Clone,
        {
            original: Vec&lt;T&gt;,
            possition: Vec&lt;usize&gt;,
            len: usize,
            started: bool,
        }
        impl&lt;T&gt; Combinations&lt;T&gt;
        where
            T: Ord + Clone,
        {
            //new
            pub fn new(mut original: Vec&lt;T&gt;, len: usize) -&gt; Self {
                if original.len() &gt; len &amp;&amp; len &gt;= 1 {
                    original.sort_unstable();
                    Self {
                        original,
                        possition: (0..len).collect(),
                        len,
                        started: false,
                    }
                } else {
                    panic!(&quot;the length has to be smaller then the datasets len&quot;);
                }
            }
            //insert
            fn insert(&amp;self, col: &amp;mut Vec&lt;T&gt;) {
                col.clear();
                self.possition
                    .iter()
                    .enumerate()
                    .for_each(|(p, n)| col.insert(p, self.original[*n].clone()))
            }

            //next
            pub fn next_combination(&amp;mut self, mut comb: &amp;mut Vec&lt;T&gt;) -&gt; bool {
                if !self.started {
                    // first pass throught
                    self.started = true;
                    self.insert(&amp;mut comb);
                    true
                } else {
                    let org_len = self.original.len();
                    // check if we cant bump the back number
                    if self.original[self.possition[self.len - 1]] == self.original[org_len - 1] {
                        // locate the number closest behind that needs to be bumped
                        for i in 2..=self.len {
                            if self.original[self.possition[self.len - i]]
                                &lt; self.original[org_len - i]
                            {
                                //find the value of the
                                let lastpos = self.possition[self.len - i];
                                let val = &amp;self.original[lastpos];
                                for j in lastpos + 1..org_len {
                                    if *val &lt; self.original[j] {
                                        for k in 0..i {
                                            self.possition[self.len - i + k] = j + k;
                                        }
                                        self.insert(&amp;mut comb);
                                        return true;
                                    }
                                }
                            }
                        }
                        false
                    } else {
                        let mut i = self.possition[self.len - 1];
                        let current = &amp;self.original[i];
                        let mut next = current;
                        while current == next {
                            i += 1;
                            next = &amp;self.original[i];
                        }
                        self.possition[self.len - 1] = i;
                        self.insert(&amp;mut comb);
                        true
                    }
                }
            }
        }
        impl&lt;T&gt; Iterator for Combinations&lt;T&gt;
        where
            T: Ord + Clone,
        {
            type Item = Vec&lt;T&gt;;

            fn next(&amp;mut self) -&gt; Option&lt;Self::Item&gt; {
                let mut vals = Vec::with_capacity(self.len);
                if self.next_combination(&amp;mut vals) {
                    Some(vals)
                } else {
                    None
                }
            }
        }
        let mut comb = Combinations::new(vec![1, 2, 3, 4], 3).collect::&lt;Vec&lt;_&gt;&gt;();
        println!(&quot;{:?}&quot;, comb); //[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
}
fn main(){
    combinations();
}</code></pre></pre>
<h2 id="二分查找-binary-search"><a class="header" href="#二分查找-binary-search">二分查找 (binary search)</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>let binary_search = |f: Vec&lt;i32&gt;, target: i32| {
        let mut low = 0;
        let mut high = f.len() - 1;
        while low &lt; high {
            let mid = f64::floor((high - low) as f64 / 2.) as usize + low;
            if f[mid] &lt; target {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        return low;
};
assert_eq!(binary_search(vec![2, 5, 8], 8),2);
<span class="boring">}</span></code></pre></pre>
<h2 id="hj4-字符串分割"><a class="header" href="#hj4-字符串分割">HJ4 字符串分割</a></h2>
<p>•输入一个字符串，请按长度为8拆分每个输入字符串并进行输出；</p>
<p>•长度不是8整数倍的字符串请在后面补数字0，空字符串不处理。
输入描述：
连续输入字符串(每个字符串长度小于等于100)</p>
<p>输出描述：
依次输出所有分割后的长度为8的新字符串</p>
<pre><code>示例1
输入：
abc
复制
输出：
abc00000
</code></pre>
<pre><pre class="playground"><code class="language-rust">use std::io::{self, *};

fn main() {
    let stdin = io::stdin();
    unsafe {
        for line in stdin.lock().lines() {
            let mut ll = line.unwrap();
            if ll.len()==8{
                println!(&quot;{}&quot;,ll);
            }
            else if ll.len()&lt;8{
                let z = 8-ll.len();
                for i in 0..z{
                    ll.push('0');
                }
                println!(&quot;{}&quot;,ll);

            }
            else{
                let l_vec = ll.split(&quot;&quot;).filter(|s|!s.is_empty()).map(|s|s.to_string()).collect::&lt;Vec&lt;_&gt;&gt;();
                let ll_vec = l_vec.chunks(8).collect::&lt;Vec&lt;_&gt;&gt;();
                for ll in ll_vec{
                    if ll.len()==8{
                println!(&quot;{}&quot;,ll.join(&quot;&quot;));
            }
            else if ll.len()&lt;8{
                let mut lll = ll.to_vec();
                let z = 8-ll.len();
                for i in 0..z{
                    lll.push(&quot;0&quot;.to_string());
                }
                println!(&quot;{}&quot;,lll.join(&quot;&quot;));

            }
                }
            }
        }
    }
}</code></pre></pre>
<h2 id="chunks-windows"><a class="header" href="#chunks-windows">chunks windows</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn chunk_windows() {
    let a = vec![1, 2, 3];
    let a_chunks = a
        .iter()
        .as_slice()
        .chunks(2)
        .map(|s| s.to_vec())
        .collect::&lt;Vec&lt;_&gt;&gt;();
    let a_windows = a
        .iter()
        .as_slice()
        .windows(2)
        .map(|s| s.to_vec())
        .collect::&lt;Vec&lt;_&gt;&gt;();
    println!(&quot;{:?}&quot;, a_chunks);
    println!(&quot;{:?}&quot;, a_windows);
    // [[1, 2], [3]]
    // [[1, 2], [2, 3]]
}
<span class="boring">}</span></code></pre></pre>
<h2 id="字母出现次数统计-count-letters"><a class="header" href="#字母出现次数统计-count-letters">字母出现次数统计 (count letters)</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>//是否有效的字母异位词
pub fn is_anagram(s: String, t: String) -&gt; bool {
    //字母出现次数统计
    fn count_letter(s: String) -&gt; std::collections::BTreeMap&lt;char, i32&gt; {
        use std::collections::BTreeMap;
        let mut map: BTreeMap&lt;char, i32&gt; = BTreeMap::new();
        for c in s.chars() {
            if !map.contains_key(&amp;c) {
                map.insert(c, 0);
            } else {
                *map.get_mut(&amp;c).unwrap() += 1;
            }
        }
        map
    }
    count_letter(s) == count_letter(t)
}
<span class="boring">}</span></code></pre></pre>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->
                            <a rel="prev" href="../../posts/leetcode/rust_huawei.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                                <i class="fa fa-angle-left"></i>
                            </a>

                            <a rel="next" href="../../posts/leetcode/olympiad_training.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                                <i class="fa fa-angle-right"></i>
                            </a>

                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">
                    <a rel="prev" href="../../posts/leetcode/rust_huawei.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                        <i class="fa fa-angle-left"></i>
                    </a>

                    <a rel="next" href="../../posts/leetcode/olympiad_training.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                        <i class="fa fa-angle-right"></i>
                    </a>
            </nav>

        </div>



        <script>
            window.playground_line_numbers = true;
        </script>

        <script>
            window.playground_copyable = true;
        </script>

        <script src="../../ace.js"></script>
        <script src="../../editor.js"></script>
        <script src="../../mode-rust.js"></script>
        <script src="../../theme-dawn.js"></script>
        <script src="../../theme-tomorrow_night.js"></script>

        <script src="../../elasticlunr.min.js"></script>
        <script src="../../mark.min.js"></script>
        <script src="../../searcher.js"></script>

        <script src="../../clipboard.min.js"></script>
        <script src="../../highlight.js"></script>
        <script src="../../book.js"></script>

        <!-- Custom JS scripts -->
        <script src="../../src/js/custom.js"></script>


    </div>
    </body>
</html>
